Første tester¶
Jeg bruker trimesh, som er et ganske omfattende meshverktøy i Python. Med dette lager jeg en funksjon som:
- Importerer en meshfil (i vårt tilfelle vil det være STL-filer).
- Setter en farge på alle polygonene.
- Oppretter en scene med meshet. Som standard vises bare overflaten og ikke kantene eller punktene i meshet, men det er mulig å legge disse til i scenen. Andre instillinger som lys og kamera kan også settes, men jeg har foreløpig ikke gjort noe med det.
Denne funksjonen gir et utgangspunkt for senere justeringer. Hvis vi for eksempel vil framheve hvor avviket er størst, tror jeg det er en relativt enkel modifisering av funksjonen. Det hadde også vært interessant (men kanskje vanskelig) å lage en slider for sammenligning av to mesh.
Her er koden til funksjonen:
import trimesh
def load_mesh_scene(filename, show_edges=False):
mesh = trimesh.load(filename)
color = [128, 176, 255, 255]
mesh.visual.face_colors = color
geometries = [mesh]
if show_edges:
edges = mesh.face_adjacency_edges
path = trimesh.path.Path3D(**trimesh.path.exchange.misc.edges_to_path(edges, mesh.vertices.copy()))
geometries.append(path)
scene = trimesh.Scene(geometries)
return scene
Videre har jeg brukt Heightmap meshing utility til å konvertere heightmapet Obsidian.png til følgende meshfiler:
| Fil | Antall polygoner | Fil- størrelse | Vurdering |
|---|---|---|---|
| Obsidian5m.stl | 5 millioner | 70.8 MB | Brukes som referanse |
| Obsidian10k.stl | 10k | 0.52 MB | Ingen fine detaljer |
| Obsidian40k.stl | 40k | 2 MB | Detaljer begynner å komme frem |
| Obsidian80k.stl | 80k | 4.1 MB | De fleste detaljer er til stede |
| Obsidian150k.stl | 150k | 7.6 MB | Omtrent som referanse |
Jeg har skrevet en vurdering av resultatene som må tas med en stor klype salt, ettersom jeg kun har studert hvert mesh etter øyemål (se under). Ideelt sett ønsker jeg å lage noen funksjoner som på en god måte kan visualisere forskjellen mellom referansemeshet og de komprimerte meshene.
Merk at jeg ikke vet hva riktig skalering av høydeaksen er. Her har jeg satt maksimal høyde til ca. 10 % av lengden/bredden.
Dere kan se resultatene under (venstre musknapp for rotasjon, høyre museknapp for translasjon).
mesh1 = load_mesh_scene("Obsidian5m.stl") #referansemesh
mesh1.show()